<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;
use Intervention\Image\ImageManagerStatic as Image;

/**
 * 文件上传类
 */
class UploadsFileController extends Controller
{

    //允许文件上传的key
    protected $allow_file_name_arr = [
        'img',
        'news',
        'production',
        'author_img',
        'foreword',
        'production_cover',
        'production_video',
        'production_voice',
        'digital_img',
        'book_img',
        'resource_img',
        'branch_map',
        'banner',
        'goods_img',
        'head_img'
    ];
    //需要生成缩略图的key
    protected $need_thumb_file_name_arr = [
        //'news',
        'production_cover',
        'author_img',
        'foreword',
        'goods_img',
        'head_img',
    ];
    /**
     * 定义图片上传公共方法           (单文件与多文件都可以(多文件上传不生成缩略图)  暂不支持多文件上传)
     * @param file 文件名   根据每个方法要求不同，传不同名称   默认file
     *                     固定参数   img  前台活动报名，上传图片   不需生成缩略图   最大1M
     *                     固定参数   news 新闻   需生成缩略图   最大1M
     *                     固定参数   production  展览图片   需生成缩略图   最大10M
     *                     固定参数   author_img 作者   需生成缩略图   最大2M
     *                     固定参数   foreword   前言   需生成缩略图   最大2M
     *                     固定参数   production_video 展览视频   需生成缩略图   最大200M
     *                     固定参数   digital_img 数字阅读图片   不需生成缩略图
     *                     固定参数   book_img 书籍图片   不需生成缩略图
     *                     固定参数   branch_img 场馆图片   不需生成缩略图
     *                     固定参数   branch_map 文旅地图   不需生成缩略图
     *                     固定参数   banner BANNER图片   不需生成缩略图
     *                     固定参数   goods_img 商品图片   需生成缩略图
     *                     固定参数   head_img 头像   需生成缩略图
     *
     *
     *
     *                     固定参数   terminal_video  屏幕视频     无需生成缩略图   最大2M
     *                     固定参数   bookcase        终端        无需生成缩略图   最大2M
     *                     固定参数   book_img       书籍封面      需要生成缩略图的key   最大2M
     *      *              固定参数   resource_img   资源推荐封面   无需生成缩略图   最大2M
     *                     固定参数   installation_screen       屏幕安装包（命名必须Screen-Stand-Alone-A开头）      不需要生成缩略图的key   最大30M
     *                     固定参数   screen_log    终端屏幕终端日志  最大 3M  文件命名规范  002800005~1995-06-15.txt
     */
    public function commonUpload(Request $request)
    {

        $file_name = array_keys($_FILES);
        //   dd([request()->file($file_name[0])->getMimeType(),request()->file($file_name[0])->getClientMimeType(),request()->file($file_name[0])->getClientOriginalExtension()]);

        if (empty($file_name))  return response()->json(['code' => 201, 'msg' => '上传文件不能为空']);

        if (!in_array($file_name[0], $this->allow_file_name_arr)) return response()->json(['code' => 201, 'msg' => '上传文件名错误']);


        //验证文件类型和大小
        $file_validate = $this->fileValidate($request, $file_name[0]);
        if ($file_validate !== true) {
            return response()->json(['code' => 201, 'msg' => $file_validate]);
        }

        //终端屏幕终端日志
        if ($file_name[0] == 'screen_log') {
            $name = $_FILES[$file_name[0]]['name'];
            $case_name = strtolower(str_replace('.txt', '', explode('~', $name)[0]));
            $foldername = $file_name[0] . '/' . $case_name; //$file_name.'/'.$case_name  存放路径，按终端存放存储
            $file = $request->file($file_name)->storeAs($foldername, $name); //第二个参数是，保持原名
        }
        if ($file_name[0] == 'installation_screen') {
            $name = $_FILES[$file_name[0]]['name'];

            if (strpos($name, 'Screen-Stand-Alone-A') === false) {
                return response()->json(['code' => 201, 'msg' => 'apk包命名不符合规范']);
            }

            $foldername = $file_name[0] . '/' . date('Y-m-d');
            $file = $request->file($file_name[0])->storeAs($foldername, $name); //第二个参数是，保持原名
        } else {
            $foldername = $file_name[0] . '/' . date('Y-m-d'); //$file_name.'/'.date('Y-m-d')  存放路径，按日志存储
            $file = $request->file($file_name[0])->store($foldername);
        }

        $file_addr = public_path('uploads') . '/' . $file; //图片地址

        if ($file) {
            $data['img'] = substr($file, 0, 1) == '/' ? substr($file, 1, strlen($file)) : $file; //去掉第一个 斜线

            //是否需要生成缩略图
            if (in_array($file_name[0], $this->need_thumb_file_name_arr)) {
                $thumb_img = $this->getThumbImg($file_addr, $file); //获取缩略图
                if ($thumb_img) {
                    $data['thumb_img'] = $thumb_img['thumb_img_name'];
                    $data['width'] = $thumb_img['small_img_width'];
                    $data['height'] = $thumb_img['small_img_height'];
                } else {
                    $data['thumb_img'] = substr($file, 0, 1) == '/' ? substr($file, 1, strlen($file)) : $file; //去掉第一个 斜线
                    $data['width'] = null;
                    $data['height'] = null;
                }
            }

            return (['code' => 200, 'msg' => '上传成功', 'content' => $data]);
        } else {
            return (['code' => 404, 'msg' => '未找到资源', 'data' => '']);
        }
    }


    /**
     * 获取图片封面（缩略图）
     * @param $file_addr 图片路径  ,数据库存放路径
     * @param $file 原图片返回到前端的地址
     */
    public function getThumbImg($file_addr, $file)
    {
        ini_set('memory_limit', '1024M'); //临时加大内存，否则在生成缩略图时可能没反应 Image::make($file_addr) 时；

        $img_info = @getimagesize($file_addr);
        // if(!$img_info) return 'default/default_production_cover.png';//图片不存在直接返回false
        if (!$img_info) return ''; //图片不存在直接返回'' ; 使用默认图片

        $width = $img_info[0];
        $height = $img_info[1];


        $small_img_width = $width < 500 ? (int)$width : 500; //缩略图宽
        $ratio = round($small_img_width / $width, 2); //计算压缩比
        $small_img_height = round($height * $ratio, 2); //高度按宽度比例压缩
        // $small_img_height = $small_img_height > 1000 ? 1000 : (int)$small_img_height; //限制图片太高
        // $small_img_height = (int)$small_img_height; //限制图片太高

        // dump($width);
        // dump($height);
        // dump($small_img_width);
        // dump($ratio);
        // dump($small_img_height);die;


        $thumb_img = Image::make($file_addr)->resize($small_img_width, $small_img_height);

        //插入水印, 水印位置在原图片的右下角, 距离下边距 10 像素, 距离右边距 15 像素
        //  $thumb_img->insert('C:\Users\admin\Desktop/logo.png', 'bottom-right', 5, 1);
        //将处理后的图片重新保存到其他路径
        $thumb_img_addr = str_replace('.', '_thumb.', $file_addr);
        $thumb_img = $thumb_img->save($thumb_img_addr);

        if (is_object($thumb_img)) {
            $thumb_img_name = str_replace('.', '_thumb.', $file);
            return ['thumb_img_name' => $thumb_img_name, 'small_img_width' => $small_img_width, 'small_img_height' => $small_img_height];
        }
        return ''; //生成失败，返回默认图
    }





    /**
     * 文件验证
     */
    public function fileValidate($request, $file = 'file')
    {
        $file_type = $this->getFileTypeAndSize($file);
        // dump($request->file());
        // dump($request->$file->extension());

        //获取文件真实后缀名 $request->$file->extension()
        $validator = Validator::make($request->file(), [
            $file => 'required|file|max:' . $file_type['size'] . '|mimes:' . $file_type['ext'],
        ], [
            //验证是否存在文件
            $file . '.required' => '文件不能为空',
            //验证是否为文件
            $file . '.file' => '请确认你的文件格式',
            //验证文件上传大小
            $file . '.max' => '文件大小不符合要求',
            //验证上传文件格式
            $file . '.mimes' => '请确认上传文件后缀' . $file_type['ext'],
        ]);
        if ($validator->fails()) { //如果有错误
            // return $validator->errors(); //返回得到错误
            return join('|', $validator->errors()->toArray()[$file]); //获取所有的错误，用 | 拼接
        }

        return true;
    }

    /**
     * 根据文件名，定义上传允许的后缀 和 文件大小
     * https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types   mimes mimetypes  对照表
     */
    public function getFileTypeAndSize($file_name)
    {
        switch ($file_name) {
            case 'production':
                $file_type = ['size' => 10 * 1024, 'ext' => 'jpg,png,jpeg']; //10M   size 是以 kb为单位
                break;
            case 'book_img':
                $file_type = ['size' => 2 * 1024, 'ext' => 'jpg,png,jpeg'];
                break;
            case 'resource_img':
                $file_type = ['size' => 2 * 1024, 'ext' => 'jpg,png,jpeg'];
                break;
            case 'production_cover':
                $file_type = ['size' => 0.5 * 1024, 'ext' => 'jpg,png,jpeg']; //0.5M   size 是以 kb为单位
                break;
            case 'production_video':
                $file_type = ['size' => 200 * 1024, 'ext' => 'mp4,mov']; //200M
                break;
            case 'production_voice':
                $file_type = ['size' => 10 * 1024, 'ext' => 'mp3,m4a']; //10M
                break;
            case 'installation_screen':
                $file_type = ['size' => 30 * 1024, 'ext' => 'apk,zip']; //30M    //apk文件被识别成了 zip文件
                break;
            case 'screen_log':
                $file_type = ['size' => 3 * 1024, 'ext' => 'txt']; //3M
                break;
            case 'doc_file':
                $file_type = ['size' => 3 * 1024, 'ext' => 'xls,xlsx,doc,docx,zip']; //3M  //xlsx文件有时会被识别成了 zip文件，有时正常， docx文件有时会被识别成了 zip文件，有时正常，   doc，xls 则还是  xls格式
                break;
            case 'ui_resource':
                $file_type = ['size' => 5 * 1024, 'ext' => 'zip']; //500KB  //xlsx文件有时会被识别成了 zip文件，有时正常， docx文件有时会被识别成了 zip文件，有时正常，   doc，xls 则还是  xls格式
                break;
            default:
                $file_type = ['size' => 1 * 1024, 'ext' => 'jpg,png,jpeg'];
                break;
        }
        return $file_type;
    }
}
